#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
@Time    : 2024/7/15 1:23
@Author  : thezehui@gmail.com
@File    : 1.基础LangGraph示例.py
"""
import sys
from typing import TypedDict, Annotated, Any
import requests

import dotenv
import httpx
from langchain_openai import ChatOpenAI
from langgraph.graph import StateGraph, START, END, MessageGraph
from langgraph.graph.message import add_messages

import requests

# 禁用 SSL 验证
requests.Session().verify = False  # 全局禁用验证
dotenv.load_dotenv()

llm = ChatOpenAI(model="gpt-4o-mini", http_client=httpx.Client(verify=False))


# 1.创建状态图，并使用GraphState作为状态数据
class State(TypedDict):
    """图结构的状态数据和归纳函数"""
    # add_messages这个归纳函数会合并所有的messages也就是上个节点输入的消息，跟本节点生成的消息进行合并
    messages: Annotated[list, add_messages]
    use_name: str  # 这个字段如果更新，会覆盖之前的更新


def chatbot(state: State, config: dict) -> Any:
    """聊天机器人节点，使用大语言模型根据传递的消息列表生成内容"""
    ai_message = llm.invoke(state["messages"])
    return {"messages": [ai_message], "use_name": "chatbot"}


# 有两种类型的图，第一种为StateGraph，第二种为MessageGraph
# 状态数据类型为字典
graph_builder = StateGraph(State)
# 状态数据类型为列表
# graph_builder = MessageGraph(State)

# 2.添加节点
graph_builder.add_node("llm", chatbot)

# 3.添加边
graph_builder.add_edge(START, "llm")
graph_builder.add_node("chatbot",chatbot)
graph_builder.add_edge("llm", "chatbot")
graph_builder.add_edge("chatbot", END)

# 4.编译图为Runnable可运行组件
graph = graph_builder.compile()

# 5.调用图架构应用
print(graph.invoke({"messages": [("human", "你好，你是谁，我叫慕小课，我喜欢打篮球游泳")], "use_name": "graph"}))
